/**
*  \file nvdata.h
*
*  \brief
*
*  \author Michael J. Hohmann  michael.hohmann@linde-mh.de
*
*
*
*
*
*/
#ifndef NVDATA_H_INCLUDED
#define NVDATA_H_INCLUDED

/*================================================[ public includes  ]================================================*/
#include "../cfg/prj.h"
#include "../parameter/parameter.h"
#include "../timerecorder/timerecorder.h"
#include "../sdstructmgr/sdstructmgr.h"
#include "../dtc/dtc.h"

/*================================================[ public defines   ]================================================*/
#define nvdata  ((struct nvdata_obj*)(NIL))

#define ADDRESS_DTC_OPERATER 		&nvdata->param_reserve[0]
#define SIZE_DTC_OPERATER 			sizeof(nv_readWriteparam)

#define ADDRESS_READWRITE_PARAM 	(ADDRESS_DTC_OPERATER)
#define SIZE_READWRITE_PARAM		(SIZE_DTC_OPERATER)			/* make sure <= 0x600 ,limit by  param_reserve[0x600] */

#define ADDRESS_DTC_CODE_LIST		&nvdata->error_list[0]
#define SIZE_DTC_CODE_LIST 			sizeof(nv_dtcCodelist)		/* make sure less than 0x140/2 = 160  limited by error_list[] array  */

#define ADDRESS_DTC_STATUS_LIST		&nvdata->error_queue[0]
#define SIZE_DTC_STATUS_LIST 		sizeof(nv_dtcStatusList)	/* makesure size not bigger than 0x1000,limited by error_queue[]  array, 14*(number_of_history_dtc_type1) + 30*(number_of_history_dtc_type2) */

/*================================================[ public datatypes ]================================================*/

/** Production Parameter.
*
*/
typedef struct nv_readWriteparam
{
	U16 pop_historydtcindex_type0;
	U16 pop_historydtcindex_type1;
	U16 pop_historydtcindex_type2;
	
	U16 push_historydtcindex_type0;
	U16 push_historydtcindex_type1;
	U16 push_historydtcindex_type2;
	
	U16 total_historydtc_type0;
	U16	total_historydtc_type1;
	U16 total_historydtc_type2;

	/* lead-acid eeprom info */
	S32 pre_soc;
	
}nv_readWriteparam;

typedef struct nv_dtcCodelist
{
	U16 dtc_history_type0[MAX_TOTAL_HISTORYDTC_TYPE0];
	U16 dtc_history_type1_code[MAX_TOTAL_HISTORYDTC_TYPE1];
	U16 dtc_history_type2_code[MAX_TOTAL_HISTORYDTC_TYPE2];	
}nv_dtcCodelist;

typedef struct nv_dtcStatusList
{
	histDtcStatusType1_t dtc_history_type1_status[MAX_TOTAL_HISTORYDTC_TYPE1];
	histDtcStatusType2_t dtc_history_type2_status[MAX_TOTAL_HISTORYDTC_TYPE2];	
}nv_dtcStatusList;

struct EDA_sttyIdentifier
{

/*----------------------------------------------------------------------------
  ZWECK: Part Number and HW ID Length
  WERTE: 32Bit Zahl oder String mit Länge 11
  AUFL.: digits
  BEM. : max. Länge: 11 + 1 Dummy für gerade Adresse
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 u16NumberFormat;                   /* 0x000 - 0x001*/

/*----------------------------------------------------------------------------
  ZWECK: HW ID
  WERTE:
  AUFL.:
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U8 u8HW_Id[12];                        /* 0x002 - 0x00D*/

/*----------------------------------------------------------------------------
  ZWECK: PartNumber
  WERTE:
  AUFL.:
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U8 u8PartNumber[12];                   /* 0x00E - 0x019*/

/*----------------------------------------------------------------------------
  ZWECK: LastPartNumber
  WERTE:
  AUFL.:
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U8 u8LastPartNumber[12];               /* 0x01A - 0x025*/

/*----------------------------------------------------------------------------
  ZWECK: Hardware Serial Nr
  WERTE: 15 byte String + 1 Dummy für gerade Adresse
  AUFL.: digits
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U8 u8SerialNumber[16];                 /* 0x026 - 0x035*/

/*----------------------------------------------------------------------------
  ZWECK: Brand-ID
  WERTE: 0x0100: Linde
         0x0200: STILL
  AUFL.: conf
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 u16BrandID;                        /* 0x036 - 0x037*/

/*----------------------------------------------------------------------------
  ZWECK: Controllertype
  WERTE: 15 byte String + 1 Dummy für gerade Adresse
  AUFL.: digits
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U8 u8ControllerType[16];               /* 0x038 - 0x047*/

/*----------------------------------------------------------------------------
  ZWECK: Baudrate Bus A
  WERTE:
  AUFL.: [kBaud]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16CANBaudrateA;               /* 0x048 - 0x049*/

/*----------------------------------------------------------------------------
  ZWECK: Baudrate Bus B
  WERTE:
  AUFL.: [kBaud]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16CANBaudrateB;               /* 0x04A - 0x04B*/

/*----------------------------------------------------------------------------
  ZWECK: Prozess Knoten A Inv1
  WERTE:
  AUFL.: [Id]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16ProzessKnotenNrAInv1;       /* 0x04C - 0x04D*/

/*----------------------------------------------------------------------------
  ZWECK: Prozess Knoten A Inv 2
  WERTE:
  AUFL.: [Id]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16ProzessKnotenNrAInv2;       /* 0x04E - 0x04F*/

/*----------------------------------------------------------------------------
  ZWECK: Prozess Knoten B
  WERTE:
  AUFL.: [Id]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16ProzessKnotenNrB;           /* 0x050 - 0x051*/

/*----------------------------------------------------------------------------
  ZWECK: Tool Knoten A
  WERTE:
  AUFL.: [Id]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16ToolKnotenNrA;              /* 0x052 - 0x053*/

/*----------------------------------------------------------------------------
  ZWECK: Tool Knoten B
  WERTE:
  AUFL.: [Id]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16ToolKnotenNrB;              /* 0x054 - 0x055*/

/*----------------------------------------------------------------------------
  ZWECK: KWP Knoten A
  WERTE:
  AUFL.: [Id]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16KWPKnotenNrA;               /* 0x056 - 0x057*/

/*----------------------------------------------------------------------------
  ZWECK: KWP Knoten B
  WERTE:
  AUFL.:
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16KWPKnotenNrB;               /* 0x058 - 0x059*/

/*----------------------------------------------------------------------------
  ZWECK: CAN Offset für Init01 Request A
  WERTE:
  AUFL.: [Id]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16Init01OffsetA;              /* 0x05A - 0x05B*/

/*----------------------------------------------------------------------------
  ZWECK: CAN Offset für Init01 Request B
  WERTE:
  AUFL.:
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 CAN_u16Init01OffsetB;              /* 0x05C - 0x05D*/

/*----------------------------------------------------------------------------
  ZWECK: Communication Profile
  WERTE:
  AUFL.:
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U16 VER_u16ComProfile;                 /* 0x05E - 0x05F*/

/*----------------------------------------------------------------------------
  ZWECK: Zeitstempel Fatal Fehler
  WERTE: Unix-Time
  AUFL.: [s]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U32 MCM_u32FatalErrorTimestamp;        /* 0x060 - 0x063*/

/*----------------------------------------------------------------------------
  ZWECK: Zeitstempel Fertigung
  WERTE: Unix-Time
  AUFL.: [s]
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 17.04.19

  BEZEICHNER                        ADRESSE                   */
  U32 MCM_u32ProductionTimestamp;        /* 0x064 - 0x067*/

/*----------------------------------------------------------------------------
  ZWECK: SW ID aus EDA Flash Daten
  WERTE:
  AUFL.:
  BEM. :
  AUTOR: CMMD/sb
  DATUM: 13.12.19

  BEZEICHNER                        ADRESSE                   */
  U8 u8SW_Id_EDA[12];                    /* 0x068 - 0x073*/

/*----------------------------------------------------------------------------
  ZWECK: frei
  WERTE:
  AUFL.:
  BEM. :
  AUTOR:
  DATUM:

  BEZEICHNER                        ADRESSE                   */
  U16 u16NotAvailable0x074[68];          /* 0x074 - 0x0FB*/

  U32 flag;                              /* 0x0FC - 0x0FF*/

} ;


struct EDA_sttyTools
{

/*----------------------------------------------------------------------------
  ZWECK: Konfiguration DA-Umsetzer
  WERTE: 0: keine Ausgabe
         1: tempor?re Ausgabe
         2: permanente Ausgabe
         3: erzwungene Ausgabe
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U8 u8DAC_conf;                         /* 0x000 - 0x000*/

/*----------------------------------------------------------------------------
  ZWECK: Konfiguration Datenlogger
  WERTE: 0: inaktiv
         1: aktiv
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U8 u8LOG_conf;                         /* 0x001 - 0x001*/

/*----------------------------------------------------------------------------
  ZWECK: DAC1 Enable
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U8 u8DAC1on;                           /* 0x002 - 0x002*/

/*----------------------------------------------------------------------------
  ZWECK: DAC1 Konfig
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U8 au8DAC1conf[48];                    /* 0x003 - 0x032*/

/*----------------------------------------------------------------------------
  ZWECK: DAC2 Enable
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U8 u8DAC2on;                           /* 0x033 - 0x033*/

/*----------------------------------------------------------------------------
  ZWECK: DAC2 Konfig
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U8 au8DAC2conf[48];                    /* 0x034 - 0x063*/

/*----------------------------------------------------------------------------
  ZWECK: Kennung f��r Zugangsschutz
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: R+T/mtu
  DATUM: 10.01.17

  BEZEICHNER                        ADRESSE                   */
  U32 u32AccessCtrl;                     /* 0x064 - 0x067*/

/*----------------------------------------------------------------------------
  ZWECK: inverse Kennung f��r Zugangsschutz
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: R+T/mtu
  DATUM: 10.01.17

  BEZEICHNER                        ADRESSE                   */
  U32 u32AccessCtrlInv;                  /* 0x068 - 0x06B*/

/*----------------------------------------------------------------------------
  ZWECK: Development Paramerters verf��gbar
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U16 u16DevParametersAvailable;         /* 0x06C - 0x06D*/

/*----------------------------------------------------------------------------
  ZWECK: Testmode
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U16 u16Testmode;                       /* 0x06E - 0x06F*/

/*----------------------------------------------------------------------------
  ZWECK: Testmode Invertiert
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: CMMD/sb
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U16 u16TestmodeInv;                    /* 0x070 - 0x071*/

/*----------------------------------------------------------------------------
  ZWECK: frei
  WERTE: 
  AUFL.: 
  BEM. : 
  AUTOR: 
  DATUM: 

  BEZEICHNER                        ADRESSE                   */
  U8 u8NotAvailable0x072[58];            /* 0x072 - 0x0AB*/
  U32 flag;

} EDA_sttyTools;


/** Object definition.
* 
* The struct nvdata_obj defines the attribute of an object.
*/
struct nvdata_obj
{   
    struct EDA_sttyIdentifier       stIdentifier;                        /*0x0000-0x00FF*/
    struct EDA_sttyIdentifier       stIdentifierCopy;                    /*0x0100-0x01FF*/
    struct EDA_sttyTools            stTools;                             /*0x0200-0x02AF*/
    U8                              shellADC[0x150];                     /*0x02B0-0x03FF*/
    struct timerecoder_times        times[4][timerecoder_channel_max];   /*0x0400-0x059F*/
    struct sdstructmgr_management   times_management[4];                 /*0x05A0-0x05BF*/
    U8                              error_list[0x200];                   /*0x05C0-0x07BF*/
    struct production_parameter_nv  production_parameter;                /*0x07C0-0x07FF*/
    struct calibration_parameter_nv calibration_parameter;               /*0x0800-0x09FF*/  
    U8                              cal_reserve[0x600];                  /*0x0A00-0x0FFF*/
    struct service_parameter_nv     parameter;                           /*0x1000-0x17FF*/
    U8                              param_reserve[0x600];                /*0x1800-0x1DFF*/
    U8                              param_reserve1[0x1F0];               /*0x1E00-0x1FEF*/
    U8                              magic_word[0x10];                    /*0x1FF0-0x1FFF*/
    U8                              truck_list[0x800];                   /*0x2000-0x27FF*/ 
    U8                              reserve[0x800];                      /*0x2800-0x2FFF*/
    U8                              restore[0x2000];                     /*0x3000-0x4FFF*/
    U8                              error_queue[0x1000];                 /*0x5000-0x5FFF*/
};


/*================================================[ public variables ]================================================*/

/*================================================[ inline functions ]================================================*/

/*================================================[ public functions ]================================================*/
/**
*  Initialization.
*
*  Initialize the nvdata module.
*
*  \return RC_SUCCESS if successful.
*/
RC nvdata_initialize( void );

/**
*  Constructor.
*
*  Construct an object. 
*
*  \param me Object pointer. NULL will throw an assert.
*
*  \return RC_SUCCESS if successful.
*/
RC nvdata_construct( struct nvdata_obj *me );

/*====================================================================================================================*/

#endif

/***********************************************************************************************************************
*                             Copyright 2018 Linde Material Handling. All rights reserved.                             *
***********************************************************************************************************************/
